package cn.jw.starter.redis.core.event.model;

import org.springframework.context.ApplicationEvent;

import com.alibaba.fastjson2.JSON;

import cn.hutool.core.util.StrUtil;
import cn.jw.starter.redis.core.event.IRedisEventId;
import lombok.Getter;

/**
 * 转发redis 事件的sping 事件，redis的监听器收到redis的发布事件内容时，会使用spring的事件机制转发出去，
 * 接收者只需要监听此事件即可。
 *
 * @author: wds_prc
 * @since: 2024/8/2 17:05
 */
public class JwSpringRedisEvent extends ApplicationEvent {

    @Getter
    private String eventId;

    /**
     * 事件消息内容，是一个json字符串
     */
    private String message;

    public JwSpringRedisEvent(Object source, String eventId, String message) {
        super(source);
        this.eventId = eventId;
        this.message = message;
    }

    /**
     * 判断是否要处理的目标event
     *
     * @param redisEventId
     * @return
     */
    public boolean isTargetEvent(IRedisEventId redisEventId) {
        String newEventId = redisEventId.getEventId();
        return eventId.equals(newEventId);
    }

    /**
     * 如果有一个事件满足，就返回true，否则返回false
     *
     * @param redisEventIds
     * @return
     */
    public boolean isTargetEvent(IRedisEventId... redisEventIds) {
        if (redisEventIds==null) {
            return false;
        }
        for (IRedisEventId redisEventId : redisEventIds) {
            if (eventId.equals(redisEventId.getEventId())) {
                return true;
            }
        }
        return false;
    }

    public <T extends AbstractRedisEvent> T getEvent(Class<T> clazz) {
        if (StrUtil.isEmpty(this.message)) {
            return null;
        }
        return JSON.parseObject(this.message, clazz);
    }
}
